/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pooproj.repositorio;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import pooproj.basica.Filme;
import pooproj.erro.ConexaoException;
import pooproj.erro.ConsultaException;
import pooproj.util.GerenciadorConexao;
import pooproj.util.GerenciadorConexaoImpl;

/**
 *
 * @author Daniella
 */
public class RepositorioFilmeImpl implements RepositorioFilme {

    //obter a instância utilizada para qualquer método desta classe
    private GerenciadorConexao gc = GerenciadorConexaoImpl.getInstancia();
    
    @Override
    public void inserir(Filme f) throws ConsultaException, ConexaoException {
        Connection con = gc.conectar();
        String sql = "INSERT INTO filme (nomeFilme, codCateg) VALUES (?,?)";
        try {
            PreparedStatement pstm = con.prepareStatement(sql);
            pstm.setString(1, f.getNomeFilme());
            pstm.setInt(2, f.getCategoria().getCodCateg());
            pstm.executeUpdate();//usado para INSERT,UPDATE e DELETE
        } catch (SQLException e) {
            throw new ConsultaException(e.getMessage());
        } finally {
            gc.desconectar(con);
        
      }
    
    }
    @Override
    public void alterar(Filme f) throws ConsultaException, ConexaoException {
        Connection con = gc.conectar();
        String sql = "UPDATE filme SET nomeFilme=?,codCateg=? WHERE codFilme=?";
        
        try{
            PreparedStatement pstm = con.prepareStatement(sql);
            pstm.setString(1, f.getNomeFilme());
            pstm.setInt(2, f.getCategoria().getCodCateg());
            pstm.setInt(3, f.getCodFilme());
            pstm.executeUpdate();//usado para INSERT,UPDATE e DELETE
        } catch (SQLException e){
            throw new ConsultaException(e.getMessage());
        } finally {
            gc.desconectar(con);
        }
    }
    
    @Override
    public void excluir(Filme f) throws ConsultaException, ConexaoException {
        Connection con = gc.conectar();
        String sql = "DELETE FROM filme WHERE codFilme=?";
        try{
            PreparedStatement pstm = con.prepareStatement(sql);
            pstm.setInt(1, f.getCodFilme());
            pstm.executeUpdate();//usado para INSERT,UPDATE e DELETE
      } catch (SQLException e){
          throw new ConsultaException(e.getMessage());
      } finally {
            gc.desconectar(con);
        }
    }

    @Override
    public ArrayList<Filme> listar() throws ConsultaException, ConexaoException {
        ArrayList<Filme> lista = new ArrayList();
        Filme f;
        Connection con = gc.conectar();
        String sql = "SELECT filme.codFilme, filme.nomeFilme, filme.codCateg, categoria.nomeCateg FROM filme, categoria WHERE filme.codCateg=categoria.codCateg";
        
        try{
            Statement stm = con.createStatement();
            ResultSet rs = stm.executeQuery(sql);//usado para SELECT
            while(rs.next()){
                f = new Filme();
                f.setCodFilme(rs.getInt("codFilme"));
                f.setNomeFilme(rs.getString("nomeFilme"));
                f.getCategoria().setCodCateg(rs.getInt("codCateg"));
                f.getCategoria().setNomeCateg(rs.getString("nomeCateg"));
                lista.add(f);
            }
            stm.close();
            rs.close();
        } catch (SQLException e){
            throw new ConsultaException(e.getMessage());
        }
         return lista;
    }

    @Override
    public Filme consultar(Integer id) throws ConsultaException, ConexaoException {
        Filme f = null;
        Connection con =  gc.conectar();
        String sql = "SELECT filme.codFilme, filme.nomeFilme, filme.codCateg, categoria.nomeCateg FROM filme, categoria WHERE filme.codCateg=categoria.codCateg AND codFilme=?";
        
        try{
            PreparedStatement pstm = con.prepareStatement(sql);
            pstm.setInt(1, id);
            ResultSet rs = pstm.executeQuery();//usado para SELECT
            if(rs.next()){
                f = new Filme();
                f.setCodFilme(rs.getInt("codFilme"));
                f.setNomeFilme(rs.getString("nomeFilme"));
                f.getCategoria().setCodCateg(rs.getInt("codCateg"));
                f.getCategoria().setNomeCateg(rs.getString("nomeCateg"));
            }
        } catch (SQLException e){
            throw new ConsultaException(e.getMessage());
        } finally {
            gc.desconectar(con);
        }
        return f;
    }

    @Override
    public Filme consultar(String nome) throws ConsultaException, ConexaoException {
        Filme f = null;
        Connection con =  gc.conectar();
        String sql = "SELECT filme.codFilme, filme.nomeFilme, filme.codCateg, categoria.nomeCateg FROM filme, categoria WHERE filme.codCateg=categoria.codCateg AND nomeFilme=?";
        
        try{
            PreparedStatement pstm = con.prepareStatement(sql);
            pstm.setString(1, nome);
            ResultSet rs = pstm.executeQuery();//usado para SELECT
            if(rs.next()){
                f = new Filme();
                f.setCodFilme(rs.getInt("codFilme"));
                f.setNomeFilme(rs.getString("nomeFilme"));
                f.getCategoria().setCodCateg(rs.getInt("codCateg"));
                f.getCategoria().setNomeCateg(rs.getString("nomeCateg"));
            }
        } catch (SQLException e){
            throw new ConsultaException(e.getMessage());
        } finally {
            gc.desconectar(con);
        }
        return f;
    }
    
}
